package com.SoftwareManage.controller;

import com.SoftwareManage.entity.Permission;
import com.SoftwareManage.entity.Role;
import com.SoftwareManage.entity.RolePermission;
import com.SoftwareManage.service.PermissionService;
import com.SoftwareManage.service.RoleService;
import com.SoftwareManage.util.IpUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Controller
@RequestMapping("/role")
public class RoleController {
    @Autowired
    private RoleService roleService;
    @Autowired
    private PermissionService permissionService;

    private final static Logger logger = LoggerFactory.getLogger(RoleController.class);

    //跳转到role页面
    @RequestMapping("/role")
    public String toSoftware(Model model,
                             HttpServletRequest request){
        String ipAddr= IpUtil.getIpAddr(request);
        logger.info(ipAddr+"------跳转到角色页面------");
        List<Role> roles=roleService.selectAll();
        List<Permission> permissions=permissionService.selectAll();
        model.addAttribute("number",roles.size());
        model.addAttribute("permissions",permissions);
        return "role";
    }


    //role页面list回调函数请求所有数据
    @RequestMapping(value = "/lists")
    @ResponseBody
    public Map<String, Object> showEntity(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer limit) throws IOException {
        List<Role> roles = roleService.selectAll();
        int pageNum = (page - 1) * limit;
        List<RolePermission> rolePermissions = roleService.selectAlls(pageNum, limit);
        for (RolePermission rolePermission:rolePermissions){
            String permission=roleService.selectRolePermissions(rolePermission.getId()).toString();
            rolePermission.setPermission(permission);
        }
        Map<String, Object> tableData = new HashMap<String, Object>();
        //这是layui要求返回的json数据格式
        tableData.put("code", 0);
        tableData.put("msg", "");
        //将全部数据的条数作为count传给前台（一共多少条）
        tableData.put("count", roles.size());
        //将分页后的数据返回（每页要显示的数据）
        tableData.put("data", rolePermissions);
        //返回给前端
        return tableData;
    }

    //查询信息
    @RequestMapping(value = "/search", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> search(
            @RequestParam(required = false) String role_name,
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer limit
    ) {
        Map<String, Object> tableData = new HashMap<String, Object>();
        List<Role> roles=roleService.search(role_name);
        int pageNum = (page - 1) * limit;
        List<RolePermission> rolePermissions= roleService.searchs(role_name,pageNum, limit);
        for (RolePermission rolePermission:rolePermissions){
            String permission=roleService.selectRolePermissions(rolePermission.getId()).toString();
            rolePermission.setPermission(permission);
        }
        tableData.put("code", 0);
        tableData.put("msg", "");
        //将全部数据的条数作为count传给前台（一共多少条）
        tableData.put("count", roles.size());
        //将分页后的数据返回（每页要显示的数据）
        tableData.put("data", rolePermissions);
        //返回给前端
        return tableData;
    }

    //	修改信息
    @RequestMapping(value = "/edit", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> editEntity(
            @RequestParam("id") int id,
            @RequestParam("role_name") String role_name,
            @RequestParam("remark") String remark,
            HttpServletRequest request){
        String ipAddr= IpUtil.getIpAddr(request);
        Map<String, Object> tableData = new HashMap<String, Object>();
        if (id==3){
            tableData.put("code", 200);
            tableData.put("msg", "");
            //将全部数据的条数作为count传给前台（一共多少条）
            tableData.put("count", 0);
            //将分页后的数据返回（每页要显示的数据）
            tableData.put("data", "");
            logger.info(ipAddr+"------[role]超级管理员无法修改------");
            //返回给前端
            return tableData;
        }
        roleService.update(id,role_name,remark);
        tableData.put("code", 100);
        tableData.put("msg", "");
        //将全部数据的条数作为count传给前台（一共多少条）
        tableData.put("count", 0);
        //将分页后的数据返回（每页要显示的数据）
        tableData.put("data", "");
        logger.info(ipAddr+"------[role]修改成功------");
        //返回给前端
        return tableData;
    }

    //	重置权限
    @RequestMapping(value = "/reset", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> resetEntity(@RequestParam("arr") String arr,
                                           HttpServletRequest request){
        String ipAddr= IpUtil.getIpAddr(request);
        Map<String, Object> tableData = new HashMap<String, Object>();
        String[] arrs = arr.split(",");
        int role_id=Integer.parseInt(arrs[0]);
        if (role_id==3){
            tableData.put("code", 200);
            tableData.put("msg", "");
            //将全部数据的条数作为count传给前台（一共多少条）
            tableData.put("count", 0);
            //将分页后的数据返回（每页要显示的数据）
            tableData.put("data", "");
            logger.info(ipAddr+"------[role]超级管理员无法重置权限------");
            //返回给前端
            return tableData;
        }
        roleService.deleteRolePermission(role_id);
        for (int i=1;i<arrs.length;i++) {
            int permission_id=Integer.parseInt(arrs[i]);
            roleService.addRolePermission(role_id,permission_id);
        }
        tableData.put("code", 100);
        tableData.put("msg", "");
        //将全部数据的条数作为count传给前台（一共多少条）
        tableData.put("count", 0);
        //将分页后的数据返回（每页要显示的数据）
        tableData.put("data", "");
        logger.info(ipAddr+"------[role]重置成功------");
        //返回给前端
        return tableData;
    }

    //	添加角色
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> addEntity(
            @RequestParam("a_role_name") String role_name,
            @RequestParam("a_remark") String remark,
            @RequestParam("arr") String arr,
            HttpServletRequest request){
        String ipAddr= IpUtil.getIpAddr(request);
        Map<String, Object> tableData = new HashMap<String, Object>();
        List<String> roles=roleService.selectAllRoles();
        if (roles.contains(role_name)){
            tableData.put("code", 200);
            tableData.put("msg", "");
            //将全部数据的条数作为count传给前台（一共多少条）
            tableData.put("count", 0);
            //将分页后的数据返回（每页要显示的数据）
            tableData.put("data", "");
            logger.info(ipAddr+"------[role]添加失败，角色已存在------");
            //返回给前端
            return tableData;
        }
        //添加角色
        roleService.addRole(role_name,remark);
        int role_id=roleService.selectRole(role_name).getId();
        String[] arrs = arr.split(",");
        for (int i=0;i<arrs.length;i++) {
            int permission_id=Integer.parseInt(arrs[i]);
            //添加权限
            roleService.addRolePermission(role_id,permission_id);
        }
        tableData.put("code", 100);
        tableData.put("msg", "");
        //将全部数据的条数作为count传给前台（一共多少条）
        tableData.put("count", 0);
        //将分页后的数据返回（每页要显示的数据）
        tableData.put("data", "");
        logger.info(ipAddr+"------[role]添加成功------");
        //返回给前端
        return tableData;
    }

    //删除信息
    @RequestMapping(value = "/remove", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> removeEntity(@RequestBody int[] ids,
                                            HttpServletRequest request) {
        String ipAddr= IpUtil.getIpAddr(request);
        Map<String, Object> tableData = new HashMap<String, Object>();
        for (int role_id : ids) {
            roleService.deleteRole(role_id);
        }
        tableData.put("code", 100);
        tableData.put("msg", "");
        //将全部数据的条数作为count传给前台（一共多少条）
        tableData.put("count", 0);
        //将分页后的数据返回（每页要显示的数据）
        tableData.put("data", "");
        logger.info(ipAddr+"------[role]删除成功------");
        //返回给前端
        return tableData;
    }


}
